import { EntityObjectFactory } from "../entityObjectFactory";

let EntityObject = EntityObjectFactory.GetEntityObjectType();
export class Promotion extends EntityObject<Promotion> {
    constructor(ctx?) { super(ctx); }
    id: string;
    storeId: string;
    /**
     * 活动名称
     * 
     * @type {string}
     * @memberOf Promotion
     */
    name: string;
    /**
     * 活动类型（item: 单品促销 | total: 整单促销 | orderdiscount: 整单折扣  |presents: 赠送）
     * 
     * @type {string}
     * @memberOf Promotion
     */
    type: string;
    /**
     * 活动有效期（开始）
     * 
     * @type {number}
     * @memberOf Promotion
     */
    validFrom: number;
    validTo: number;
    /**
     * 客户显示名
     * 
     * @type {string}
     * @memberOf Promotion
     */
    customerName: string;
    /**
     * 创建人
     * 
     * @type {{ id: string; name: string }}
     * @memberOf Promotion
     */
    creator: { id: string; name: string }
    /**
     * 创建时间
     * 
     * @type {number}
     * @memberOf Promotion
     */
    createTime: number;
    /**
     * 描述
     * 
     * @type {string}
     * @memberOf Promotion
     */
    description: string;
    /**
     * 活动定义（auto:自动，manual:人工）
     * 活动规则自动起效或者由店员手动选择。
     * 
     * @type {string}
     * @memberOf Promotion
     */
    actionMode: string;
    promotionContent: PromotionContent[];
    schedule: Schedule;
    /**
     * 促销对象（会员）
     * 
     * @type {any[]}
     * @memberOf Promotion
     */
    applicableTo: [{
        name: string;
        objectType: string;
        presetId: string;
        rule: {
            memberTypes: any[];
            ageGreat: number;
            ageLess: number;
            birth: string;
            sex: string;
        };
    }];
    enabled: boolean;
    options: { excludeItemsDiscount: boolean };

    toString() {
        return "itempromotion";
    }
}

interface Schedule {
    time: { from: number; to: number };
    /**
     * 一周中有效的天，可多天，不设置为全周
     * 
     * @type {any[]}
     * @memberOf Schedule
     */
    weekdays: number[];
    /**
     * 月份中的天数，不设置为全天，最大值是31，如果
     * 当月没有此日，则视为无效
     * 
     * @type {any[]}
     * @memberOf Schedule
     */
    monthDates: any[];
}

interface PromotionContent {
    ruleName: string;
    /**
     * 优惠方式 discount 折扣 | cashback 返现
     * 
     * @type {string}
     * @memberOf PromotionContent
     */
    mode: string;
    /**
     * 促销规则 整单促销为null
     * 
     * @type {string}
     * @memberOf PromotionContent
     */
    defineMode: string;
    rule: Rule;
    content: Content;
}

interface Rule {
    /**
     * 总金额(去掉单项折扣)需满的金额
     * 例如去掉单项折扣后总金额“满200打X折”的活动，应当设置当前值为“200”。
     * 不设置或0表示不限制。如果设置了不参加活动的商品，金额合计还将排除这部分金额。
     * 
     * @type {*}
     * @memberOf Rule
     */
    amountGreat: number;
    /**
     * 促销订单序数
     * 用于定义“前x个订单优惠”的活动场景，“0”表示不限制。
     * 如果定义了促销时间，则从促销时间开始，未定义则从当前业务日开始。
     * 
     * @type {*}
     * @memberOf Rule
     */
    orderNumberLess: number;
    totalGreate: any;
}

interface Content {
    /**
     * low-price | 
     * 
     * @type {string}
     * @memberOf Content
     */
    applyChoose: string;
    applyQty: number;
    every: number;
    everyQty: number;
    maxQty: number;
    min: number;
    items: ContentItem[];
    categories: [{
        id: string;
        name: string;
        discount: number;
    }];

    /**
     * 排除的商品分类{['cate1','cate2']}
     * 
     * @type {any[]}
     * @memberOf Content
     */
    excludesCategories: [{ id: string; name: string }];
    /**
     * 排除的商品单项{['invt-id1','invt-id2']}
     * 
     * @type {any[]}
     * @memberOf Content
     */
    excludesItems: [{ id: string; name: string; code: string; price: number }];
    /**
     * 折扣时，打折的折扣0-10
     * 返现时，返现的金额。
     * 
     * @type {number}
     * @memberOf Content
     */
    value: number;
}

interface ContentItem {
    id: string;
    code: string;
    name: string;
    price: number;
    specialPrice: number;
    discount: number;
}